iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

前言

昨天和前天,我們使用網頁資料和CSV資料作為外部的資料源,今天我們會介紹使用txt檔案,或者是副檔名為py的檔案來進行匯入轉成向量,並作為資料源給LLM提示,利用py或txt檔案皆可,這會和我們之後的應用有關係!

正文


資料,請另存一個檔案

這是我們讀取的資料,叫做day11-data.py 主要是基於OpenCV的一個應用,來作為學習的範本

# 載入外部模組
import numpy as np
import cv2
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# 畫矩形rectangle(影像矩陣,左上xy座標,右下xy座標,顏色(B,G,R),粗細)
cv2.rectangle(img, (100,0), (400,200), (255,255,0), 3)

# 畫矩形rectangle(影像矩陣,左上xy座標,右下xy座標,顏色(B,G,R),填滿)
cv2.rectangle(img, (100,400), (400,500), (0,0,255), -1)

#顯示圖形
cv2.imshow('img', img)

# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)

# 關閉所有視窗
cv2.destroyAllWindows()


模型

  • 步驟和之前一樣,先匯入模型
# 1. Create model
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI API key"

model = ChatOpenAI(model="gpt-4o")

embeddingmodel = OpenAIEmbeddings(model="text-embedding-ada-002")

Loader

  • 接著比較不同的是,我們自己繼承BaseLoader,來製作簡易的Loader,並載入進來
# 2. 製作loader並載入
class CustomDocumentLoader(BaseLoader):
    def __init__(self, file_path: str) -> None:
        self.file_path = file_path

    def lazy_load(self) -> Iterator[Document]:
        with open(self.file_path, encoding="utf-8") as f:
            line_number = 0
            for line in f:
                yield Document(
                    page_content=line,
                    metadata={"line_number": line_number,
                              "source": self.file_path},
                )
                line_number += 1


loader = CustomDocumentLoader("day11-data.py")
docs = list(loader.lazy_load())

  • 簡易說明Loader的製作上,繼承BaseLoader這個類別,當中會以file_path作為constructor的參數

  • 當呼叫lazy_load時,會回傳Iterator包裹的Document物件,可以利用這個Iterator訪問多個Document物件

  • 每一行內容都會變成一個Document物件

  • 每個Document物件除了page_content是該行的內容之外,還有metadata表示其他資訊

切割Chunk

# 3. 切分成數個chunk,自定切割大小,自訂overlap
all_text = "".join(doc.page_content for doc in docs)
print("文件長度: ", end="")
print(len(all_text))
print("chunk長度: ", end="")
chunk_size = 400
print(chunk_size)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=100)
splits = text_splitter.split_documents(docs)

轉成向量,存入向量資料庫

# 4. 轉換成embedding,儲存進Chroma向量資料庫.
vectorstore = Chroma.from_documents(
    documents=splits, embedding=embeddingmodel)

retriever = vectorstore.as_retriever()

製作Chain

# 5. 做成chain.
template = """你是一個文件分析大師,可以根據使用者提供的資訊來對文件內進行分析
文件有可能是程式碼 或者是單純的txt檔案

以下為文件的內容
              
{context}

使用者提供的額外資訊:
{user_input}

"""

custom_rag_prompt = PromptTemplate.from_template(template)


def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)


rag_chain = (
    {"context": retriever | format_docs, "user_input": lambda x: x}
    | custom_rag_prompt
    | model
    | StrOutputParser()
)

呼叫

# 6. 呼叫
result = rag_chain.invoke(
    """文件內是程式碼檔案,請讀取完後製作更多的範例來讓我學習""")
print(result)

執行結果

python day11.py
文件長度: 416
chunk長度: 400
看起來你提供的文件內包含了四個註解,這些註解似乎是用來描述程式碼中不同部分的功能。根據這些註解,我可以推測這應該是一個用於處理和顯示圖像的程式碼,
可能使用了OpenCV庫。以下是根據這些註解編寫的一個簡單的Python範例程式碼,並且我會提供更多相關的範例來幫助你學習。

### 範例1:基本圖像顯示
這個範例展示了如何使用OpenCV載入和顯示一張圖像。

```python
import cv2

# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)

# 顯示圖形
cv2.imshow('Displayed Image', image)

# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)

# 關閉所有視窗
cv2.destroyAllWindows()
```

### 範例2:顯示攝像頭影像
這個範例展示了如何使用OpenCV從攝像頭中捕捉和顯示影像。

```python
import cv2

# 載入外部模組
cap = cv2.VideoCapture(0)

while True:
    # 讀取影像
    ret, frame = cap.read()

    # 顯示圖形
    cv2.imshow('Camera Feed', frame)

    # 用waitKey等待視窗,當按下任意鍵時繼續下一部
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放攝像頭並關閉所有視窗
cap.release()
cv2.destroyAllWindows()
```

### 範例3:影像處理(灰度轉換)
這個範例展示了如何將彩色影像轉換為灰度影像並顯示。

```python
import cv2

# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)

# 轉換為灰度影像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 顯示灰度影像
cv2.imshow('Gray Image', gray_image)

# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)

# 關閉所有視窗
cv2.destroyAllWindows()
```

### 範例4:影像邊緣檢測(Canny Edge Detection)
這個範例展示了如何對影像進行邊緣檢測並顯示結果。

```python
import cv2

# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)

# 轉換為灰度影像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 進行Canny邊緣檢測
edges = cv2.Canny(gray_image, 100, 200)

# 顯示邊緣檢測結果
cv2.imshow('Edge Detection', edges)

# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)

# 關閉所有視窗
cv2.destroyAllWindows()
```

這些範例應該可以幫助你更好地理解OpenCV在Python中的基本使用方法。你可以根據自己的需求和興趣進一步修改和擴展這些範例。希望這些範例對你有幫助!     

上一篇
day10 智能CSV分析器,讓LLM幫你分析與統整
下一篇
day12 讓PDF 成為 AI 腦袋的一部分:自製簡易ChatPDF前置作業
系列文
智能雲端架構圖生成:結合LangChain&LangGrpah與Rag的創新應用27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言